﻿/*=============================================================================
* File Name : Color4.h                         Ver : 1.00  Date : 2009-4-10
*
* Description :
*
*       カラー構造体　ヘッダ
*
* Author : 土田　悠貴.
*============================================================================*/
#include "Color4.h"
#include "../math/Vector3.h"
#include "../math/Vector4.h"
#include "../math/Math.h"
#include <algorithm>

namespace tglib
{

/*===========================================================================*/
	/**
	 * コンストラクタ．
	 */
Color4::Color4() : r( 0.0f ), g( 0.0f ), b( 0.0f ), a( 0.0f )
{}

/*===========================================================================*/
/**
 * コンストラクタ．
 *
 * @param [in]  R　レッド値．
 * @param [in]  G　グリーン値．
 * @param [in]  B　ブルー値．
 * @param [in]  A　アルファ値．
 */
Color4::Color4( float R, float G, float B, float A )
	: r( R ), g( G ), b( B ), a( A )
{}

/*===========================================================================*/
/**
 * コンストラクタ．
 *
 * @param [in]  v　Vector3(RGBカラー)．
 */
Color4::Color4( const Vector3& v )
	: r( v.x ), g( v.y ), b( v.z ), a( 1.0f )
{}

/*===========================================================================*/
/**
 * コンストラクタ．
 *
 * @param [in]  v　Vector4(RGBAカラー)．．
 */
Color4::Color4( const Vector4& v )
	: r( v.x ), g( v.y ), b( v.z ), a( v.w )
{}

/*===========================================================================*/
/**
 * コンストラクタ．
 *
 * @param [in]  p　配列のポインタ．
 */
Color4::Color4( const float* p )
	: r( p[0] ), g( p[1] ), b( p[2] ), a( p[3] )
{}

/*===========================================================================*/
/**
 * 0.0～1.0に補正する．
 *
 * @return 補正したカラー値．
 */
Color4& Color4::saturate()
{
	r = std::max( 0.0f, std::min( 1.0f, r ) );
	g = std::max( 0.0f, std::min( 1.0f, g ) );
	b = std::max( 0.0f, std::min( 1.0f, b ) );
	a = std::max( 0.0f, std::min( 1.0f, a ) );

	return *this;
}

/*===========================================================================*/
/**
 * (float*型)キャスト演算子オーバーロード．
 *
 * @return   型変換をしたカラー成分．
 */
Color4::operator float* ()
{
	return reinterpret_cast<float*>(RGBA);
}

/*===========================================================================*/
/**
 * (const float*型)キャスト演算子オーバーロード．
 *
 * @return   型変換をしたカラー成分．
 */
Color4::operator const float* ()
{
	return reinterpret_cast<const float*>( RGBA );
}

/*===========================================================================*/
/**
 * (+)単項演算子オーバーロード．
 *
 * @return 結果のColor4．
 */
Color4 Color4::operator + () const
{
	return *this;
}

/*===========================================================================*/
/**
 * (-)単項演算子オーバーロード．
 *
 * @return 結果のColor4.
 */
Color4 Color4::operator - () const
{
	return Color4( -r, -g, -b, -a );
}

/*===========================================================================*/
/**
 * (+=) 演算子オーバーロード．
 * 
 * @param [in]  c Color4．
 * @return 結果のColor4．
 */
Color4& Color4::operator += ( const Color4& c )
{
	r += c.r;
	g += c.g;
	b += c.b;
	a += c.a;

	return *this;
}

/*===========================================================================*/
/**
 * (-=) 演算子オーバーロード．
 * 
 * @param [in]  c Color4．
 * @return 結果のColor4．
 */
Color4& Color4::operator -= ( const Color4& c )
{
	r -= c.r;
	g -= c.g;
	b -= c.b;
	a -= c.a;

	return *this;
}

/*===========================================================================*/
/**
 * (*=) 演算子オーバーロード．
 * 
 * @param [in]  c Color4．
 * @return 結果のColor4．
 */
Color4& Color4::operator *= ( const Color4& c )
{
	r *= c.r;
	g *= c.g;
	b *= c.b;
	a *= c.a;

	return *this;
}

/*===========================================================================*/
/**
 * (*=) 演算子オーバーロード．
 * 
 * @param [in]  s スカラー．
 * @return 結果のColor4．
 */
Color4& Color4::operator *= ( float s )
{
	r *= s;
	g *= s;
	b *= s;
	a *= s;

	return *this;
}

/*===========================================================================*/
/**
 * (/=) 演算子オーバーロード．
 * 
 * @param [in]  c Color4．
 * @return 結果のColor4．
 */
Color4& Color4::operator /= ( const Color4& c )
{
	r /= c.r;
	g /= c.g;
	b /= c.b;
	a /= c.a;

	return *this;
}

/*===========================================================================*/
/**
 * (/=) 演算子オーバーロード．
 * 
 * @param [in]  s スカラー．
 * @return 結果のColor4．
 */
Color4& Color4::operator /= ( float s )
{
	r /= s;
	g /= s;
	b /= s;
	a /= s;

	return *this;
}

/***  以下非メンバ関数 *******************************************************/

/*===========================================================================*/
/**
 * (+)演算子オーバーロード．
 * 
 * @param [in]  c1 Color4．
 * @param [in]  c2 Color4．
 * @return 結果のColor4．
 */
const Color4 operator + ( const Color4& c1, const Color4& c2 )
{
	Color4 result( c1 );

	result += c2;

	return result;
}

/*===========================================================================*/
/**
 * (-)演算子オーバーロード．
 * 
 * @param [in]  c1 Color4．
 * @param [in]  c2 Color4．
 * @return 結果のColor4．
 */
const Color4 operator - ( const Color4& c1, const Color4& c2 )
{
	Color4 result( c1 );

	result -= c2;

	return result;
}

/*===========================================================================*/
/**
 * (*)演算子オーバーロード．
 * 
 * @param [in]  c1 Color4．
 * @param [in]  c2 Color4．
 * @return 結果のColor4．
 */
const Color4 operator * ( const Color4& c1, const Color4& c2 )
{
	Color4 result( c1 );

	result *= c2;

	return result;
}

/*===========================================================================*/
/**
 * (*)演算子オーバーロード．
 * 
 * @param [in]  c Color4．
 * @param [in]  s スカラー．
 * @return 結果のColor4．
 */
const Color4 operator * ( const tglib::Color4& c, float s )
{
	Color4 result( c );

	result *= s;

	return result;
}

/*===========================================================================*/
/**
 * (*)演算子オーバーロード．
 * 
 * @param [in]  s スカラー．
 * @param [in]  c Color4．
 * @return 結果のColor4．
 */
const Color4 operator * ( float s, const Color4& c )
{
	return c * s;
}

/*===========================================================================*/
/**
 * (/)演算子オーバーロード．
 * 
 * @param [in]  c1 Color4．
 * @param [in]  c2 Color4．
 * @return 結果のColor4．
 */
const Color4 operator / ( const Color4& c1, const Color4& c2 )
{
	Color4 result( c1 );

	result /= c2;

	return result;
}

/*===========================================================================*/
/**
 * (/)演算子オーバーロード．
 * 
 * @param [in]  c Color4．
 * @param [in]  s スカラー．
 * @return 結果のColor4．
 */
const Color4 operator / ( const Color4& c, float s )
{
	Color4 result( c );

	result /= s;

	return result;
}

/*===========================================================================*/
/**
 * (==) 演算子オーバーロード．
 * 
 * @param [in]  c1 Color4．
 * @param [in]  c2 Color4．
 * @return 比較結果．
 */
bool operator == ( const Color4& c1, const Color4& c2 )
{
	return ( c1.r == c2.r && c1.g == c2.g && c1.b == c2.b && c1.a == c2.a );
}

/*===========================================================================*/
/**
 * (!=) 演算子オーバーロード．
 * 
 * @param [in]  c1 Color4．
 * @param [in]  c2 Color4．
 * @return 比較結果．
 */
bool operator != ( const Color4& c1, const Color4& c2 )
{
	return !( c1 == c2 );
}

} // namespace tglib

/*========= End of File =====================================================*/
